const http = require('http')
const fs = require('fs')


var server = http.createServer((req,res)=>{
    res.writeHead(200,{'Content-Type':'text/html;charset=utf8'})    
    res.end(fs.readFileSync('./111.html'))//返回页面readFileSync--返回文件
})
//socket	// nodejs-websocket
const Server = require('ws').Server;

//建立好了服务端
var wss = new Server({server})//


//存放前端连接的socket
var clientMap = {}  //每个连接
var count = 0  //代表连接人数
var id = 0  //连接人id
//当客户端连接上的就会触发，回调会接收一个socket对象
wss.on("connection",function (socket) {
    count++ 
    id++
    socket.id = id
    clientMap[socket.id] = socket
    socket.nickname = '好友'
    console.log(`现在有${count}人连接了`)
    broadClients(socket.nickname,1)  //返回给连接用户  客户列表
		
	

    //当这个客户端发送数据的时候会触发
    socket.on("message",function (msg) {
		// msg---->前端传来信息 msg.nickname--昵称   msg.msg--当条信息
        //console.log(`客户端${socket.id} 说：${msg}`)
	
        let info = JSON.parse(msg)
        console.log(info)
        var htmlReg=/<[^>]+>/g;
        // 前端来的数据不符合规则
        if(htmlReg.test(info.nickname)||htmlReg.test(info.msg)){
            // 
            console.log("正则进来了")
        }else{
          if(socket.nickname!=info.nickname){//socket.nickname
            socket.nickname = info.nickname;//替换昵称
            broadClients()//更新客户列表
            }
            socket.nickname = info.nickname
            broadcast(socket,info.msg) //把信息发送给各个客户端
        }
    })
	

    //当客户端断开的时候触发
    socket.on("close",function () {
        //console.log(`客户端${socket.id} 说：${msg}`)
        count--
        let nickname = socket.nickname //收集断开的昵称
        delete clientMap[socket.id]  //从客户端列表种中删除
			
        broadClients(nickname,2)//从新返回客户列表
       
      
    })

    //当客户端连接出错的时候
    socket.on("error",function (err) {
        console.log(err)
    })

})

//广播函数，像所有的客户端发送某一个客户端说的话
function  broadcast(socket,msg) {
	//    		昵称                      消息      类型:msg
    let info = {nickname:socket.nickname,msg:msg,type:'msg'}
    for(var id in clientMap){//clientMap 循环每个客户端 返回数据
        info.isMe = socket.id==id?'true':false,//判断自己的数据
        clientMap[id].send(JSON.stringify(info))//返回数据
    }
}
		//返回客户端信息---------用户列表 
function  broadClients(nickname,type) {
    let clients = []//昵称数组
    for(var id in clientMap){
        clients.push(clientMap[id].nickname)	
    }
    for(var id in clientMap){ //clientMap---客户集合
			// 循环客户端 返回数据
        clientMap[id].send(JSON.stringify({
            count:count,  //连接总人数
			clients:clients,//昵称数组
            type:'count',//type:"count"
            nickname:nickname, //昵称
            _type:type  // 1---加入群聊  2---离开群聊
        }))
    }
}
 server.listen(3000,'192.168.134.9')


// 今日作业
// 1. 今日知识点 抄一遍
// 2. 练习localStroage讲过的案例
// 3. 预习css3新增属性